package middleware

//中间件相关

import (
	"github.com/gin-gonic/gin"
	"new_club_recruitment/global"
	"new_club_recruitment/model/common/response"
	"new_club_recruitment/service"
	"new_club_recruitment/utils"
	"strconv"
	"strings"
)

var tokenServe = service.ServiceGroupApp.SysServiceGroup.RedisServe

// JWTAuthMiddleware 基于JWT的认证中间件
func JWTAuthMiddleware() gin.HandlerFunc {
	return func(c *gin.Context) {
		// 客户端携带Token有三种方式 1.放在请求头 2.放在请求体 3.放在URI
		// 这里假设Token放在Header的Authorization中，并使用Bearer开头
		// 这里的具体实现方式要依据你的实际业务情况决定
		authHeader := c.Request.Header.Get("Authorization")
		if authHeader == "" {
			//auth为空
			response.FailWithMessage("未登录或非法访问", c)
			c.Abort()
			return
		}
		// 按空格分割
		parts := strings.SplitN(authHeader, " ", 2)
		if !(len(parts) == 2 && parts[0] == global.GVA_CONFIG.JWT.Header) {
			//auth格式有误
			response.FailWithMessage("auth格式有误", c)
			c.Abort()
			return
		}
		// parts[1]是获取到的tokenString，我们使用之前定义好的解析JWT的函数来解析它
		mc, err := utils.ParseToken(parts[1])
		if err != nil {
			if err == utils.TokenExpired {
				response.FailWithDetailed(gin.H{"reload": true}, "授权已过期", c)
				c.Abort()
				return
			}
			response.FailWithDetailed(gin.H{"reload": true}, err.Error(), c)
			c.Abort()
			return
		}
		ok := tokenServe.CheckToken(strconv.Itoa(int(mc.UserId)), parts[1])
		if !ok {
			response.FailWithMessage("您的帐户异地登陆或令牌失效", c)
			c.Abort()
			return
		}
		// 将当前请求的username信息保存到请求的上下文c上
		c.Set("id", mc.UserId)
		c.Set("permission", mc.Permission)
		c.Next() // 后续的处理函数可以用过c.Get("key")来获取当前请求的用户信息
	}
}
